home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / misc / amag / 9b92.lha / Knobelecke / projekt_e.s < prev    next >
Text File  |  1992-07-21  |  6KB  |  160 lines

  1. ;*************************
  2. ;*       PROJEKT e       *
  3. ;*         von           *
  4. ;*      G.Steffens       *
  5. ;*************************
  6.  
  7. ExecBase:         equ   4
  8. RawDoFmt:         equ   -522
  9. OldOpenLib:       equ   -408
  10. CloseLib:         equ   -414
  11. Open:             equ   -30
  12. Close:            equ   -36
  13. Write:            equ   -48
  14. Output:           equ   -60
  15. langworte:        equ   105   ; mindestens 2
  16. laenge:           equ   4*langworte
  17.  
  18. ;***********************************************
  19.    move.l   ExecBase,a6       ;
  20.    lea      dosname(pc),a1    ; doslibrary
  21.    jsr      OldOpenLib(a6)    ; öffnen
  22.    move.l   d0,dosbase        ; Zeiger sichern
  23.    move.l   d0,a6             ; dosbase holen
  24.    jsr      Output(a6)        ; handle holen
  25.    move.l   d0,handle         ; und sichern
  26.  
  27. ;*********** Speicherbereiche löschen **********
  28.    lea      dividend(pc),a0   ;
  29.    lea      summe(pc),a3      ;
  30.    move.l   #langworte-1,d0   ; Umläufe
  31. clrloop:
  32.    clr.l    (a0)+             ; löschen
  33.    clr.l    (a3)+             ; löschen
  34.    dbra     d0,clrloop        ; usw. ->
  35.  
  36. ;************* Division durchführen ************
  37.    lea      summe(pc),a3      ;
  38.    lea      dividend(pc),a2   ;
  39.    moveq    #1,d2             ; Zähler i=1
  40.    move.l   #langworte,d4     ; langworte
  41.    move.l   d2,(a2)           ; dividend=1
  42.    move.l   d2,(a3)           ; summe=1
  43. loop:
  44.    move.l   a2,a0             ; 1.Position<>0
  45.    move.l   d4,d7             ; langworte in 
  46.    add      d7,d7             ; worte wandeln
  47.    subq     #1,d7             ; d7=Umläufe
  48.    moveq    #0,d0             ; Rest=0
  49. divloop:
  50.    move     (a0),d0           ; [Rest][Wort]=d0
  51.    divu     d2,d0             ; Langwort/i=
  52.    move     d0,(a0)+          ; Quotient ->(a0)
  53.    dbra     d7,divloop        ; Rest übernehmen
  54.  
  55. ;*************** Summe bilden ******************
  56.    lea      dividend(pc),a0   ;
  57.    lea      summe(pc),a3      ;
  58.    lea      laenge(a0),a0     ; dividendende
  59.    lea      laenge(a3),a3     ; summeende
  60.    move.l   #langworte-1,d0   ; Umläufe
  61.    sub      d7,d7             ; X-flag löschen
  62. sumloop:
  63.    addx.l   -(a0),-(a3)       ; den Quotienten
  64.    dbra     d0,sumloop        ; zur Summe
  65.                               ; addieren
  66. ;***********************************************
  67.    addq.l   #1,d2             ; i=i+1
  68.    tst.l    (a2)              ; Position<>0?
  69.    bne      loop              ; nein: weiter ->
  70.    addq.l   #4,a2             ; Position erhöhen
  71.    subq.l   #1,d4             ; Umläufe-1
  72.    bne      loop              ; nächste Runde->
  73. ;******** eigentliche Rechnung beendet *********
  74.  
  75. ;************ Ausgabe der Ziffern **************
  76. alles0:
  77.    subq.l   #1,d2             ; d2 korrigieren
  78.    moveq    #0,d6             ; Gesamtlänge=0
  79.    lea      formatstr2(pc),a0 ; Anzahl der
  80.    bsr      print             ; Umläufe ausgeben
  81.    move.l   #laenge*3/5-2,d5  ; Ausgabelänge
  82. drucken:
  83.    lea      summe(pc),a3      ; da unsere Zahl
  84.    lea      laenge(a3),a3     ; im Binärsystem
  85.    move.l   #laenge/2-1,d7    ; vorliegt,
  86.    moveq    #0,d1             ; muß noch eine
  87. loop10:                       ; Umwandlung
  88.    move     -(a3),d0          ; in das
  89.    mulu     #10000,d0         ; Dezimalsystem
  90.    add.l    d1,d0             ; erfolgen.
  91.    move     d0,(a3)           ; Statt mit 10
  92.    clr      d0                ; multiplizieren
  93.    swap     d0                ; wir sogar
  94.    move.l   d0,d1             ; mit 10000, daß
  95.    dbra     d7,loop10         ; ist 4*schneller
  96.  
  97.    lea      summe(pc),a3      ; die nächsten
  98.    move.l   (a3),d2           ; 4 Stellen
  99.    lea      formatstr1(pc),a0 ; der Zahl
  100.    bsr      print             ; ausgeben und
  101.    clr.l    (a3)              ; dann löschen
  102.    addq.l   #4,d6             ; Gesamtlänge
  103.    dbra     d5,drucken        ; weiter im Text
  104.  
  105.    move.l   d6,d2             ; Anzahl der
  106.    lea      formatstr3(pc),a0 ; ausgegebenen
  107.    bsr      print             ; Ziffern
  108.  
  109. ;************* Rückzug einleiten **************
  110. ende2:
  111.    move.l   ExecBase,a6       ;
  112.    move.l   dosbase(pc),a1    ; Dos-Library
  113.    jsr      CloseLib(a6)      ; schließen
  114.    moveq    #0,d0             ; Returncode 0
  115.    rts                        ; und Tschüß!
  116.  
  117. ;********** Unterroutine Textausgabe **********
  118. print:
  119.    movem.l  d0-a6,-(a7)       ; alles sichern
  120.    move.l   #-1,length        ; Zähler löschen
  121.    lea      datas(pc),a1      ; Datenspeicher
  122.    move.l   d2,(a1)           ; Wert einladen
  123.    lea      routine(pc),a2    ; Hilfsroutine
  124.    lea      buffer,a3         ; Zeichenpuffer
  125.    move.l   ExecBase,a6       ; und nun
  126.    jsr      RawDoFmt(a6)      ; formatieren
  127.  
  128.    move.l   handle(pc),d1     ; filehandle
  129.    move.l   #buffer,d2        ; Pufferadresse
  130.    move.l   length,d3         ; Textlänge
  131.    move.l   dosbase(pc),a6    ;
  132.    jsr      Write(a6)         ; Text ausgeben
  133.    movem.l  (a7)+,d0-a6       ; restaurieren
  134.    rts                        ; und zurück
  135.  
  136. ;********* Hilfsroutine für RawDoFmt **********
  137. routine:                      ; ein Zeichen in
  138.    move.b   d0,(a3)+          ; Ausgabepuffer
  139.    clr.b    (a3)              ; Endekode
  140.    addq.l   #1,length         ; Textlänge
  141.    rts                        ; und zurück
  142.  
  143. ;*************** diverse Daten ****************
  144. length:     dc.l  0
  145. dosbase:    dc.l  0
  146. handle:     dc.l  0
  147. datas:      dc.l  0
  148.  
  149. dosname:    dc.b  "dos.library",0
  150. formatstr1: dc.b  "%04ld",0
  151. formatstr2: dc.b  "Umläufe : %-ld",10,0
  152. formatstr3: dc.b  10,"Anzahl der Nachkommastellen: %-ld",10,0
  153.    even
  154. buffer:     ds.b  256
  155. dividend:   ds.b  laenge
  156. summe:      ds.b  laenge
  157.  
  158.    end
  159.  
  160.